「展開運算符」與「其餘運算符」,
兩者的表示方式都是 ...
,
以下分別說明。
展開運算符(Spread Operator)
以下語法建議使用展開運算符取代:
Array.prototype.concat()
Object.assign()
範例:
const todos =["aaa","bbb","ccc"]
//使用展開運算符
const addTodos =[...todos, "ddd"];
//等同於
const addTodos = todos;
addTodos.push("ddd");
展開作為函式參數:
function sum(a, b, c) {
return a + b + c
}
const args = [1, 2, 3]
sum(...args) // 6
或者這樣寫也可以
function sum() {
const [a,b,c] = arguments;
const [d,e,f] = [...arguments];
console.log(a+b+c)
console.log(d-e-f)
}
sum(1, 2, 3) //6 -4
arguments 是類陣列,無法操作僅屬於陣列的方法,需要先轉換成陣列類型才能使用。
屬於淺拷貝(物件只會展開一層,內層的物件仍是複製參考)
const person = {
name: "Mike",
}
const person2 = {
...person,
pets: { dog: 1, cat: 2 }
};
person2.name = "Jay";
console.log(person.name) // Mike -> person 的 name 維持不變
const person3 = person;
person3.name = "Eric";
console.log(person.name) // Eric -> person 的 name 被改變了
const person4 = {
...person2,
like: "Football",
}
console.log(person2) // { name: 'Jay', pets: { dog: 1, cat: 2 } }
console.log(person4) // { name: 'Jay', pets: { dog: 1, cat: 2 }, like: 'Football' }
console.log(person2.pets === person4.pets) // true,內部物件參考仍是相同的
其餘運算符(Rest Operator)
將函式參數「剩餘的值」組合成一個陣列
function fn(x, ...arg){
console.log(x, arg)
}
fn(1,2,3,4,5) // 1 [2,3,4,5]
const [x, ...y] = [1, 2, 3]
console.log(x) //1
console.log(y) //[2,3]
等號左右個數不相等時,會成為空陣列
const [x, y, ...z] = [1]
console.log(x) //1
console.log(y) //undefined
console.log(z) //[]